package com.ITXu.reggie.service.serviceImpl;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ITXu.reggie.commom.BaseContext;
import com.ITXu.reggie.commom.CustomException;
import com.ITXu.reggie.entity.AddressBook;
import com.ITXu.reggie.entity.OrderDetail;
import com.ITXu.reggie.entity.Orders;
import com.ITXu.reggie.entity.ShoppingCart;
import com.ITXu.reggie.entity.User;
import com.ITXu.reggie.mapper.OrderMapper;
import com.ITXu.reggie.service.AddressBookService;
import com.ITXu.reggie.service.OrderDetailService;
import com.ITXu.reggie.service.OrderService;
import com.ITXu.reggie.service.ShoppingCartService;
import com.ITXu.reggie.service.UserService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Orders> implements OrderService{

	@Autowired
	private UserService userService;
	
	@Autowired
	private ShoppingCartService shoppingCartService;
	
	@Autowired
	private AddressBookService addressBookService;
	
	@Autowired
	private OrderDetailService orderDetailService;
	
	@Override
	public void submit(Orders orders) {
		Long userId = BaseContext.getCurrentId();
		User currentUser = userService.getById(userId);
		//获取当前userId的shoppingCart数据
		LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(ShoppingCart::getUserId, userId);
		List<ShoppingCart> shoppingCarts = shoppingCartService.list(queryWrapper);
		if (shoppingCarts == null || shoppingCarts.size() == 0) {
			throw new CustomException("购物车为空，不能下单");
		}
		Long addressBookId = orders.getAddressBookId();
		AddressBook addressBook = addressBookService.getById(addressBookId);
		if (addressBook == null) {
			throw new CustomException("用户地址信息有误，不能下单");
		}
		//保存数据到orderDetail表（orderDetail表的数据其实是shoppingCart集合）
		Long orderId = IdWorker.getId();
		//累加值amount
		AtomicInteger amount = new AtomicInteger(0);
		List<OrderDetail> orderDetails = shoppingCarts.stream().map((item) -> {
			OrderDetail orderDetail = new OrderDetail();
			orderDetail.setOrderId(orderId);
			orderDetail.setNumber(item.getNumber());
			orderDetail.setDishId(item.getDishId());
			orderDetail.setDishFlavor(item.getDishFlavor());
			orderDetail.setSetmealId(item.getSetmealId());
			orderDetail.setName(item.getName());
			orderDetail.setImage(item.getImage());
			orderDetail.setAmount(item.getAmount());
			amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue());
			return orderDetail;
		}).collect(Collectors.toList());
		//保存数据到orders表
		orders.setId(orderId);
		orders.setOrderTime(LocalDateTime.now());
		orders.setCheckoutTime(LocalDateTime.now());
		orders.setStatus(2);
		orders.setAmount(new BigDecimal(amount.get()));
		orders.setUserId(userId);
		orders.setNumber(String.valueOf(orderId));
		orders.setUserName(currentUser.getName());
		orders.setConsignee(addressBook.getConsignee());
		orders.setPhone(currentUser.getPhone());
		orders.setAddress(
				(addressBook.getProvinceName() == null? " ":addressBook.getProvinceName())
				+(addressBook.getCityName() == null? " ":addressBook.getCityName())
				+(addressBook.getDistrictName() == null? " ":addressBook.getDistrictName())
				+(addressBook.getDetail()) == null? " ":addressBook.getDetail());
		this.save(orders);
		orderDetailService.saveBatch(orderDetails);
	}
	
}
